package day9.homework;

import com.sun.org.apache.bcel.internal.generic.NEW;

import java.util.Random;

//通过线程实现消费者和生产者购买商品的功能:
//定义一个类产品类：属性 产品名称   最大数量   当前数量
//一个消费者线程类：属性 产品类对象
//一个生产者线程类:  属性  产品类对象
//一个测试类：初始化，运行
//要求:生产者线程，当当前数量<最大数量时候.  生产者要进行生产.提示生产数量和当前数量
//生产结束后,提示消费者可以购买。
//消费者线程, 消费者购买商品数量随机数而定，不能超过商品最大数量,如果购买数量大于商品当前数量.
//需要提示 购买的数量，库存不足。   呼叫生产者开始生产物品
//如果购买的商品数量小于商品当前数量则。正常购买 ，提示购买的数量和剩余数量
public class Product{
    String name;
    int maxNum;
    int nowNum;
    static int count;
    public Product(String name,int maxNum,int nowNum){
        this.name = name;
        this.maxNum = maxNum;
        this.nowNum = nowNum;
    }
    public static void main(String[] args) {
        Product p = new Product("鱼子酱",50,50);
        new Thread(()->{
            while (count<5){
                synchronized (p){
                    String name = Thread.currentThread().getName();
                    if (p.nowNum<p.maxNum){
                        p.notifyAll();
                        for (int i = 1; i <= p.maxNum-p.nowNum; i++) {
                            System.out.println("生产者开始生产,生产数量:"+i+",当前数量:"+(p.nowNum+i));
                        }
                        System.out.println("成产完毕！消费者可以购买");
                        p.nowNum = p.maxNum;
                    }
                    try {
                        p.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    count++;
                }
            }
        },"生产者").start();
        new Thread(()->{
            while (count<3){
                synchronized (p){
                    Random r = new Random();
                    int buys = r.nextInt(p.maxNum)+1;
                    p.notifyAll();
                    while (buys<p.nowNum){
                        count++;
                        p.nowNum -= buys;
                        System.out.println("客户购买了"+buys+"件商品,"+ p.name+"剩余"+p.nowNum+"件");
                        if (buys> p.nowNum){
                            System.out.println("消费者前来购买商品");
                            System.out.println("库存不足！呼叫生产者开始生产物品");
                            try {
                                p.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        },"消费者").start();
    }
}
